package com.xqx.rabbitmq.routing;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.xqx.rabbitmq.util.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author：xingquanxiang createTime：2019/11/28 11:25
 * description:
 * 路由模式 Routing 需要设置类型为direct的交换机，交换机和队列进行绑定，并且指定routing key，
 * 当发送消息到交换机后，交换机会根据routing key将消息发送到对应的队列
 *
 * 路由模式的交换机类型：direct
 */
public class Producer {
    /**
     * 交换机名称
     */
    static final String DIRECT_EXCHANGE = "direct_exchange";
    /**
     * 消息队列名称
     */
    static final String DIRECT_QUEUE_INSERT = "direct_queue_insert";
    static final String DIRECT_QUEUE_UPDATE = "direct_queue_update";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接
        Connection connection = ConnectionUtil.getConnection();
        //创建频道
        Channel channel = connection.createChannel();
        /**
         * 声明交换机
         * 参数1： 交换机名称
         * 参数2： 交换机类型, fanout广播、topic 通配符、direct 定向、headers
         */
        channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明创建队列
        /**
         * 参数1：队列名称
         * 参数2：是否定义持久化队列
         * 参数3：是否独占本次连接
         * 参数4：是否在不使用的时候自动删除队列
         * 参数5：队列其他参数
         */
        channel.queueDeclare(DIRECT_QUEUE_INSERT, true, false, false, null);
        channel.queueDeclare(DIRECT_QUEUE_UPDATE, true, false, false, null);
        //队列绑定交换机
        channel.queueBind(DIRECT_QUEUE_INSERT, DIRECT_EXCHANGE, "insert");
        channel.queueBind(DIRECT_QUEUE_UPDATE, DIRECT_EXCHANGE, "update");

        //要发送的消息
        String message = "新增了商品。路由模式；routing key 为 insert";
        /**
         * 参数1：交换机名称；如果没有指定则使用空字符串默认 Default Exchange
         * 参数2：路由key，简单模式可以传递队列名称
         * 参数3：消息其他属性
         * 参数4：消息内容
         */
        channel.basicPublish(DIRECT_EXCHANGE, "insert", null, message.getBytes());
        System.out.println("已发送消息：" + message);

        //要发送的消息
        message = "修改了商品。路由模式；routing key 为 update";
        /**
         * 参数1：交换机名称；如果没有指定则使用空字符串默认 Default Exchange
         * 参数2：路由key，简单模式可以传递队列名称
         * 参数3：消息其他属性
         * 参数4：消息内容
         */
        channel.basicPublish(DIRECT_EXCHANGE, "update", null, message.getBytes());
        System.out.println("已发送消息：" + message);

        //关闭资源
        channel.close();
        connection.close();
    }
}
